package 懒汉式;

/**
 * 懒汉式创建单例模式第一种方法
 * 线程不安全
 *
 */
public class Singleton {

    //私有化构造法
    private Singleton(){}

    //定义静态常量。此时没有赋值，当前的静态变量为null.注意这里也不能够定义为final类型的
    // 因为final类型必须为其初始化值。要么直接赋值，要么所有涉及到的构造器中都要初始化，要么就在静态方法块中初始化
//    private static final Singleton instance;

     private static Singleton instance;
//    static {
//        instance=new Singleton();
//    }

    // 对外提供获取单例对象的方法。注意如果不加锁的话会是线程不安全的
    public static synchronized Singleton getInstance(){
        // 如果线程1 还未创建完此对象，线程2进行调用此方法，此时的instance还是null
        // 那么它也就会进入到当前方法去创建对象，此时得到的对象就并非是单例的了
        // 解决办法就是加synchronized，直接在静态方法上加synchronized关键字。是类锁

        //因为对整个方法进行加锁，性能会降低。所以我们可以使用双重检查锁的方式来进行单例模式的实现
        if (instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}
